DuckDB FDW(外部数据包装器)来了
Why DuckDB系列:
DuckDB FDW(外部数据包装器) 来了
想第一时间体验的,请移步 https://github.com/alitrack/duckdb_fdw
DuckDB【1】 很赞,但生态不完善;PostgreSQL 生态完善,那么就借势让DuckDB适应更多的应用场景,同时也给PostgreSQL带来强大的OLAP能力。
一个duckdb_fdw相当于,
DuckDB FDW
CSV FDW(远强大于PostgreSQL自带的file_fdw)
Parquet FDW
首先感谢sqlite_fdw【2】, duckdb_fdw【3】是在sqlite_fdw源代码的基础上改出来的,在开发的同时,学习FDW和C++的开发。
安装与体验
编译安装DuckDB
首先编译DuckDB,因为duckdb_fdw依赖sqlite3_api_wrapper, 这个在DuckDB的发行版本里没有提供。
$ git clone https://github.com/cwida/duckdb
cd duckdb
make
接下来我们需要的是
build/release/tools/sqlite3_api_wrapper/libsqlite3_api_wrapper.dylib(对于Linux是libsqlite3_api_wrapper.so,Windows是libsqlite3_api_wrapper.dll)以及tools/sqlite3_api_wrapper/include/sqlite3.h
下载duckdb_fdw并编译
make USE_PGXS=1
make install USE_PGXS=1
安装duckdb_fdw扩展,
CREATE EXTENSION duckdb_fdw;
创建外部服务器对象,
CREATE SERVER DuckDB_server
FOREIGN DATA WRAPPER duckdb_fdw
OPTIONS (database '/tmp/test.db');
创建外部表
CREATE FOREIGN TABLE t1(a integer, b text)
SERVER DuckDB_server
OPTIONS (table 't1_DuckDB');
或者批量导入外部表
IMPORT FOREIGN SCHEMA public
FROM SERVER DuckDB_server
INTO public;
测试CRUD(增删改查)
与使用本地表没有差别
INSERT INTO t1 VALUES(1,'PG'),(2,'FDW'),(3,'DuckDB');
SELECT * FROM t1;
UPDATE t1 SET b='DuckDB' WHERE a=1;
DELETE FROM T1 WHERE a=1;
注:对于update和delete,则需要外部表(DuckDB表)第一列为主键,如果手工创建外部表,则需要添加OPTIONS (key 'true'),
CREATE FOREIGN TABLE t1(
a integer OPTIONS (key 'true')
, b text)
SERVER DuckDB_server
OPTIONS (table 't1_DuckDB');
对于DuckDB里基于csv(csv.gz)或者Parquet创建的视图也有很好的支持。
参考,
https://github.com/cwida/duckdb
https://github.com/pgspider/sqlite_fdw
https://github.com/alitrack/duckdb_fdw
http://www.postgres.cn/docs/12/postgres-fdw.html
欢迎star,fork和issue,https://github.com/alitrack/duckdb_fdw